其他
【他山之石】利用Tensorflow构建CNN图像多分类模型及图像参数、数据维度变化情况实例分析
“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
地址:https://blog.csdn.net/hurry0808
01
飞机 汽车 鸟类 猫 鹿 狗 青蛙 马 船只 卡车
02
Tensorflow使用数据流图进行数值计算,图中的节点代表数学运算,图中的边代表在这些节点之间传递的多维数组(张量)。在使用其构建模型时,先搭建好流图结构——类似于铺好管道,然后再加载数据——向管道中注水,让数据在各节点计算、沿各管道流动;数据在流图中计算、传递时采用多维数组(张量)的形式,因此在Tensorflow中参与计算的均为数组数据类型。
本文使用Tensorflow构建简单的CNN图像多分类模型,其由3个卷积(含激活函数)与池化层、1个扁平层、3个全连接层、1个输出层构成,示意图如下所示:
输入(Input)层
卷积(Convolution)层
1. invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度);
2. 保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力。
1. 输入图像的每个通道分别从左上角开始,每次取与卷积核大小相同的部分(称之为patch),与卷积核对应部分分别相乘后再相加(内积运算);如R通道与W0的最上部核(0核)对应元素相乘再相加得到0,G通道与w0的1核做内积运算得到2,B通道与w0的2核做内积运算后得到0;
2. 内积运算得到的结果相加,再加上w0的bias值(b0),得到feature map左上的元素值;即0+2+0+1=3;
3. 按照指定步长移动卷积核,直至输入图像被整个覆盖,得到最终的feature map;本图中步长(stride)为(2,2)。
tf.nn.conv2d(
input,
filter,
strides,
padding,
use_cudnn_on_gpu=True,
data_format='NHWC',
dilations=[1, 1, 1, 1],
name=None
)
input:需要做卷积的输入图像,它要求是一个Tensor,shape为[batch, in_height, in_width, in_channels],具体含义是[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数],注意这是一个4维的Tensor,要求类型为float32和float64其中之一; filter:相当于CNN中的卷积核,它要求是一个Tensor,shape为[filter_height, filter_width, in_channels, out_channels],具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,filter的通道数要求与input的in_channels一致,有一个地方需要注意,第三维in_channels,就是参数input的第四维; strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4,strides[0]=strides[3]=1; padding:string类型的量,只能是”SAME”、”VALID”其中之一,这个值决定了不同的卷积方式;卷积运算时卷积核滑动过程中当输入图像(input)的in_height、in_width不是filter的filter_height、filter_width的整数倍时,”SAME”方式是在input周围填充0以将其in_height、in_width补充为filter相应部分的整数倍,”VALID”方式将input的多余部分丢弃,详细介绍请参看这里; use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true; data_format:指定输入数据、输出数据的格式,取值为”NHWC”、”NCHW”,前者对应于 [batch, height, width, channels],后者对应于 [batch, channels, height, width],默认为’NHWC’。 dilations:一个可选的ints列表;默认为[1,1,1,1]。长度为4的一维张量,每个input维度的膨胀系数;如果设置为k> 1,则每个该维度上的过滤器元素之间会有k-1个跳过的单元格;维度顺序由data_format的值决定;在Dilations中批次和深度尺寸必须为1; name:为该操作指定名称; 返回值:Tensor,也就是我们常说的feature map。
‘SAME’ 类型的padding,其输出的height和width计算如下:
out_height = ceil(float(in_height) / float(strides[1])) ceil:向上取整
out_width = ceil(float(in_width) / float(strides[2]))
out_height = ceil(float(in_height – filter_height + 1) / float(strides[1]))
out_width = ceil(float(in_width – filter_width + 1) / float(strides[2]))
激活函数(Activation Function)
Tensorflow中的relu激活函数为:
tf.nn.relu(
features,
name=None
)
features: 张量,必须为以下类型中的一种:float32, float64, int32, uint8, int16, int8, int64, bfloat16, uint16, half, uint32, uint64; name: 为该操作指定名称; Returns: 张量。
池化(Pooling)层
Tensorflow实现最大池化运算的函数为:
tf.nn.max_pool(
value,
ksize,
strides,
padding,
data_format='NHWC',
name=None
)
value:输入4D张量, 其格式由data_format指定; ksize:含有4个元素的1D张量,指定池化核的尺寸; strides:含有4个元素的1D int 张量,指定池化时在图像每一维的步长,strides[0]=strides[3]=1; padding:边界填充方式,string类型的量,只能是”SAME”、”VALID”其中之一; data_format:数据格式,string类型的量, 只能是’NHWC’、 ‘NCHW’ 、’NCHW_VECT_C’ 其中之一; name:为该操作指定名称; 返回值:Tensor,也就是我们常说的feature map。
扁平化(Flatten)层
Tensorflow实现扁平化层运算的函数为:
tf.contrib.layers.flatten(
inputs,
outputs_collections=None,
scope=None
)
inputs:形如 [batch_size, …]的张量,注意张量的第1个元素必须为batch_size; outputs_collections:添加到输出的集合; scope:name_scope的可选范围。 返回值:形如[batch_size, k]的扁平化张量。
全连接(Fully Connected)层
由于全连接层参数冗余(仅全连接层参数就可占整个网络参数80%左右),需要使用tf.nn.dropout来随机丢弃一些节点,或者使用一些性能优异的网络模型如ResNet和GoogLeNet等来取代全连接层融合学到的深度特征。
tf.layers.dense(
inputs,
units,
activation=None,
use_bias=True,
kernel_initializer=None,
bias_initializer=tf.zeros_initializer(),
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None,
trainable=True,
name=None,
reuse=None
)
inputs: Tensor input. units: Integer or Long, dimensionality of the output space. activation: Activation function (callable). Set it to None to maintain a linear activation. use_bias: Boolean, whether the layer uses a bias. kernel_initializer: Initializer function for the weight matrix. If None (default), weights are initialized using the default initializer used by tf.get_variable. bias_initializer: Initializer function for the bias. kernel_regularizer: Regularizer function for the weight matrix. bias_regularizer: Regularizer function for the bias. activity_regularizer: Regularizer function for the output. kernel_constraint: An optional projection function to be applied to the kernel after being updated by an Optimizer (e.g. used to implement norm constraints or value constraints for layer weights). The function must take as input the unprojected variable and must return the projected variable (which must have the same shape). Constraints are not safe to use when doing asynchronous distributed training. bias_constraint: An optional projection function to be applied to the bias after being updated by an Optimizer. trainable: Boolean, if True also add variables to the graph collection GraphKeys.TRAINABLE_VARIABLES (see tf.Variable). name: String, the name of the layer. reuse: Boolean, whether to reuse the weights of a previous layer by the same name. Returns:Output tensor the same shape as inputs except the last dimension is of size units.
tf.nn.dropout(
x,
keep_prob,
noise_shape=None,
seed=None,
name=None
)
x: A floating point tensor. keep_prob: A scalar Tensor with the same type as x. The probability that each element is kept. noise_shape: A 1-D Tensor of type int32, representing the shape for randomly generated keep/drop flags. seed: A Python integer. Used to create random seeds. See tf.set_random_seed for behavior. name: A name for this operation (optional). Returns: A Tensor of the same shape of x.
输出(Output)层
Tensorflow中的tf.nn.softmax函数如下所示:
tf.nn.softmax(
logits,
axis=None,
name=None,
dim=None
)
logits: A non-empty Tensor. Must be one of the following types: half, float32, float64. axis: The dimension softmax would be performed on. The default is -1 which indicates the last dimension. name: A name for the operation (optional). dim: Deprecated alias for axis. Returns: A Tensor. Has the same type and shape as logits.
训练得到分类模型
batch为训练时每批输入的图像数量,视训练环境的硬件配置而定,本文设置为512 卷积核height,width:(3,3) 卷积步长:(1,1,1,1) 卷积 padding:SAME 激活函数:tf.nn.relu 最大池化height,width:(2,2) 最大池化步长:(1,2,2,1) 池化 padding:SAME Dropout时保留节点的比例:0.5 Epochs(训练轮数):30
03
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“他山之石”历史文章
pytorch中optimizer对loss的影响
使用PyTorch 1.6 for Android
神经网络解微分方程实例:三体问题
pytorch 实现双边滤波
编译PyTorch静态库
工业界视频理解解决方案大汇总
动手造轮子-rnn
凭什么相信你,我的CNN模型?关于CNN模型可解释性的思考
c++接口libtorch介绍& vscode+cmake实践
python从零开始构建知识图谱
一文读懂 PyTorch 模型保存与载入
适合PyTorch小白的官网教程:Learning PyTorch With Examples
pytorch量化备忘录
LSTM模型结构的可视化
更多他山之石专栏文章,
请点击文章底部“阅读原文”查看
分享、点赞、在看,给个三连击呗!